package com.cskaoyan.javase.oop1._11static._0introduction._0old;
/**
 * static关键字的引入
 * 引例：
 * 练习：
 * 	创建一个学生类，用来描述我们班全体同学，要求
 * 		属性：姓名，性别，年龄，学号，学校信息
 * 		行为：吃饭，学习
 *
 * 注：建议性别使用String类型的gender，不推荐使用布尔类型的isMale或者isFemale。
 *
 * 创建多个Student对象，他们的属性取值可以不同，会发现什么问题呢？
 *
 * 显然，我们会发现以下问题：
 *
 * 无论创建多少Student对象，由于该类描述的是我们班全体同学，他们的班级信息实际上是一样的
 * 创建多次对象，需要重复的给一个属性赋相同的值，这是很麻烦的，不方便的。
 * 学校信息这个属性实质上应该是被全体同学所共有的属性，而不是独属于某个对象的。
 * 所以，按照我们以往定义成员变量的方法来完成这个案例，是可以改进的。
 *
 *
 * 为了应对上述问题，我们需要改进我们的设计
 * 考虑如何改进？
 * 可以把成员变量schoolName中直接显式赋值为“王道训练营”或者直接写死构造方法
 * 这样确实可以实现功能，但是没有从根本上解决问题，问题3依然存在
 * 学校信息这个属性在每一个对象当中都存在，有点浪费内存空间
 * 最重要的，我们在设计类的时候其实已经知道这个属性，是全体对象都有，不应该属于某个对象。
 * 我们希望这个属性不是属于某一个对象的，而是一种类的特征，是属于类的，属于全体对象所共享的
 *
 * 上述改进不是我们最理想的改进方式，考虑以下改进：
 * 在内存中找一块区域，让该类的每个对象都共用这片区域，把SchoolName属性放进去
 * 于是：
 *
 * SchoolName从对象独有的成员变量变成全体对象所共享的一种变量
 * 这样做既节省空间，减少了初始化成员变量的时间损耗
 * 最重要的体现了该属性属于类，属于全体对象共享的特点
 * 实际上，属于全体对象所共享的变量在Java当中是存在的，它指的就是使用static关键字修饰的，Java当中的静态成员变量。
 *
 *
 * @since 11:13
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        WangDaoStudent s1 = new WangDaoStudent("张三","男", 18, 1, "王道训练营");
        WangDaoStudent s2 = new WangDaoStudent("李四","女", 19, 2, "王道训练营");

    }
}
class WangDaoStudent{
    String name;
    /*
        开发中,定义性别建议使用
        String gender
        不推荐使用布尔类型的isMale或者isFemale
        原因挖个坑,后面再说
     */
    String gender;
    int age;
    int id;
    String schoolName = "王道训练营";

    public WangDaoStudent() {
    }

    public WangDaoStudent(String name, String gender, int age, int id, String schoolName) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.id = id;
        this.schoolName = "王道训练营";
    }

    public void eat(){
        System.out.println("饿了,我要吃饭");
    }
    public void study(){
        System.out.println("学习真快乐!");
    }
}